#include "matrix.h"

uint8_t rows[] = { GPIO_PIN_16, GPIO_PIN_17, GPIO_PIN_18, GPIO_PIN_11};
uint8_t cols[] = { GPIO_PIN_31, GPIO_PIN_30, GPIO_PIN_25, GPIO_PIN_26};
uint8_t rows_cnt = sizeof(rows)/sizeof(rows[0]);
uint8_t cols_cnt = sizeof(cols)/sizeof(cols[0]);

struct bflb_device_s *gpio;  //gpio外设句柄

// 初始化gpio状态
void matrix_keys_init()
{
    gpio = bflb_device_get_by_name("gpio");
    // 行线设置成输出模式，输出为低电平
    for(uint8_t i=0; i<rows_cnt; i++)
    {
        bflb_gpio_init(gpio, rows[i], GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
        bflb_gpio_set(gpio, rows[i]);
    }

    // 列线设置为输入模式，上拉输入模式
    for(uint8_t i=0; i<cols_cnt; i++)
    {
        bflb_gpio_init(gpio, cols[i], GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
    }
}


// 矩阵键盘扫描
uint16_t get_key_val()
{
    uint16_t val = 0;
    for (size_t i = 0; i < rows_cnt; i++)
    {
        // 拉低行线
        bflb_gpio_reset(gpio, rows[i]);
        // 读取列线
        for (size_t j = 0; j < cols_cnt; j++)
        {
            if (bflb_gpio_read(gpio, cols[j]) == 0)
            {
                bflb_mtimer_delay_ms(10);
                if (bflb_gpio_read(gpio, cols[j]) == 0)
                {
                    val = (1 << ((i *  cols_cnt) + j));
					break;
                }
            }
        }
        // 拉高行线
        bflb_gpio_set(gpio, rows[i]);
		if(val > 0)
		{
			break;
		} 
    }
    return val;
}

char val2char(uint16_t key_val)
{
    char keychar = ' ';
    switch (key_val)
    {
    case 0x0001:
        keychar = '1';
        break;
    case 0x0002:
        keychar = '2';
        break;
    case 0x0004:
        keychar = '3';
        break;
    case 0x0008:
        keychar = 'A';
        break;
    case 0x0010:
        keychar = '4';
        break;
    case 0x0020:
        keychar = '5';
        break;
    case 0x0040:
        keychar = '6';
        break;
    case 0x0080:
        keychar = 'B';
        break;
    case 0x0100:
        keychar = '7';
        break;
    case 0x0200:
        keychar = '8';
        break;
    case 0x0400:
        keychar = '9';
        break;
    case 0x0800:
        keychar = 'C';
        break;
    case 0x1000:
        keychar = '*';
        break;
    case 0x2000:
        keychar = '0';
        break;
    case 0x4000:
        keychar = '#';
        break;
    case 0x8000:
        keychar = 'D';
        break;
    }
    return keychar;

}